#pragma once
#include <iostream>
#include <string>
#include <unordered_map>
namespace bitrpc
{
    // 请求以及响应报文正文内容的字段的宏定义
    // Rpc请求
#define KEY_METHOD "method"     // 方法名称
#define KEY_PARAMS "parameters" // 参数
// 发布订阅相关请求
#define KEY_TOPIC_KEY "topic_key" // 主题名称
#define KEY_TOPIC_MSG "topic_msg" // 主题消息
#define KEY_OPTYPE "optype"       // 操作类型
// 服务操作相关请求
#define KEY_HOST "host" // 主机信息
#define KEY_HOST_IP "ip"
#define KEY_HOST_PORT "port"
#define KEY_RCODE "rcode"   // 响应码
#define KEY_RESULT "result" // 调用结果
    // 消息类型枚举
    enum class MessageType // enum class 类型需要通过枚举类型名来访问，避免命名冲突
    {
        REQ_RPC = 0,
        RSP_RPC,
        REQ_TOPIC,
        RSP_TOPIC,
        REQ_SERVICE,
        RSP_SERVICE
    };
    // 错误码枚举
    enum class RCODE
    {
        RCODE_OK = 0,            // 成功处理
        RCODE_PARSE_FAILED,      // 解析失败
        RCODE_ERROR_MSGTYPE,     // 消息类型错误
        RCODE_INVALID_MSG,       // 消息中字段缺失或错误导致⽆效消息
        RCODE_DISCONNECTED,      // 连接断开
        RCODE_INVALID_PARAMS,    // ⽆效的Rpc参数
        RCODE_NOT_FOUND_SERVICE, // 没有找到对应的服务
        RCODE_INVALID_OPTYPE,    // ⽆效的操作类型
        RCODE_NOT_FOUND_TOPIC,   // 没有找到对应的主题
        RCODE_INTERNAL_ERROR     // 内部错误
    };
    static std::string errReason(RCODE rcode)
    {
        static std::unordered_map<RCODE, std::string> mp{
            {RCODE::RCODE_OK, "成功处理"},
            {RCODE::RCODE_PARSE_FAILED, "解析失败"},
            {RCODE::RCODE_ERROR_MSGTYPE, "消息类型错误"},
            {RCODE::RCODE_INVALID_MSG, "消息中字段缺失或错误导致⽆效消息"},
            {RCODE :: RCODE_DISCONNECTED, "连接断开"},
            {RCODE :: RCODE_INVALID_PARAMS, "⽆效的Rpc参数"},
            {RCODE :: RCODE_INVALID_OPTYPE, "⽆效的操作类型"},
            {RCODE :: RCODE_NOT_FOUND_TOPIC, "没有找到对应的主题"},
            {RCODE :: RCODE_INTERNAL_ERROR, "内部错误"}};
        if (mp.count(rcode) == 0)
        {
            return "未知错误！";
        }
        return mp[rcode];
    }
    // RPC请求类型
    enum class RType
    {
       
        REQ_ASYNC=0,    // 异步请求：返回异步对象，在需要的时候通过异步对象获取响应结果（还未收到结果会阻塞）
        REQ_CALLBACK  // 回调请求：设置回调函数，通过回调函数对响应进⾏处理
    };
    // 主题操作类型
    enum class TopicOptype
    {
        TOPIC_CREATE = 0, // 创建主题
        TOPIC_REMOVE,     // 删除主题
        TOPIC_SUBSCRIBE,  // 主题订阅
        TOPIC_CANCEL,     // 取消订阅
        TOPIC_PUBLISH     // 主题发布
    };
    //服务操作类型定义
    enum class ServiceOptype
    {
        SERVICE_REGISTRY = 0,//服务注册
        SERVICE_DISCOVERY,//服务发现
        SERVICE_ONLINE,//服务上线
        SERVICE_OFFLINE,//服务下线
        SERVICE_UNKNOW//未知服务
    };
};